Nachdem wir uns im vorherigen Kapitel den RandomWalk in 2 Dimensionen angeschaut haben, erweitern wir das Model in diesem Notebook auf 3 Dimensionen. Durch den modularen Aufbau ist dies Schnell erreicht, da wir nur 2 weitere Optionen bei den Schritten ergänzen müssen und eine weitere Achse beim zeichnen der Punkte einführen müssen.
import random as rd
import numpy
import plotly.graph_objects as go
np = 50000
ns = 10
NORTH = 1; SOUTH = 2; WEST = 3; EAST = 4; IN = 5; OUT = 6
IN und OUT sind die neu ergänzten Variablen die benötigt werden, damit wir uns im 3 dimensionalen Raum bewegen können. Sie ermöglichen die Bewegung auf der Z-Achse.
def singleStep():
position = numpy.zeros(shape=(3,), dtype=int)
currentStep = rd.randint(1, 6 + 1)
position[0] += numpy.where(currentStep == NORTH, 1, 0)
position[0] -= numpy.where(currentStep == SOUTH, 1, 0)
position[1] += numpy.where(currentStep == EAST, 1, 0)
position[1] -= numpy.where(currentStep == WEST, 1, 0)
position[2] += numpy.where(currentStep == OUT, 1, 0)
position[2] -= numpy.where(currentStep == IN, 1, 0)
return position
In der singleStep-Methode ändern wir die Größe des position-Arrays auf 3, um die neu hinzugekommmenen Werte speichern zu können. Ebenso erweitern wir bei der Generierung der Zufallszahlen die Zahlen von 1 bis 4 auf 1 bis 6 um die neuen Richtungen abzudecken. Auch die vergleiche werden um die 2 neuen Optionen erweitert, das Prinzip ist gleich zu allen anderen vergleichen. Auch hier wird als Ergebnis der Methode eine Position in Form eines Arrays zurückgegeben.
def walkSteps(numPart=1, numstep=100):
positionsArray = numpy.zeros(shape=(numstep+1, 3), dtype=int)
for step in numpy.arange(numstep):
positionsArray[step+1, ] = positionsArray[step, ] + singleStep()
tuple = (positionsArray, numstep)
return tuple
Die Methode walkSteps sit im Aufbau ebenfalls gleich zur Methode für den 2 dimensionalen RandomWalk, nur das hier das positionsArray 3 statt 2 als zweites Argument für die Größe übergeben bekommt. Auch hier gibt die Methode und Tuple bestehnd aus dem positionsArray und der Anzahl an Schritten die getätigt werden soll zurück.
def drawWalk(tuple):
positionsArray = tuple[0]
fig = go.Figure(data=go.Scatter3d(
x=positionsArray[:, 0],
y=positionsArray[:, 1],
z=positionsArray[:, 2],
mode='markers',
name='Randomwalk in 2 Dimensions',
marker=dict(
color=numpy.arange(tuple[1]),
size=5,
colorscale='Greens',
showscale=True),
line=dict(
color='darkblue',
width=2
)
))
fig.show()
Auch bei der drawWalk ist der Aufbau prinzipiell gleich zur 2 dimensionalen drawWalk. Auch hier bekommt die Methode als Parameter das Tuple übergeben. Aus diesem ziehen wir uns wieder das Array in eine eigene Variable und zeichnen unsere Grafik. Einziger Unterschied ist, dass wir eine Achse mehr haben der wir Werte zuweisen müssen.
import random as rd
import numpy
import plotly.graph_objects as go
np = 50000
ns = 10
NORTH = 1; SOUTH = 2; WEST = 3; EAST = 4; IN = 5; OUT = 6
def singleStep():
position = numpy.zeros(shape=(3,), dtype=int)
currentStep = rd.randint(1, 6 + 1)
position[0] += numpy.where(currentStep == NORTH, 1, 0)
position[0] -= numpy.where(currentStep == SOUTH, 1, 0)
position[1] += numpy.where(currentStep == EAST, 1, 0)
position[1] -= numpy.where(currentStep == WEST, 1, 0)
position[2] += numpy.where(currentStep == OUT, 1, 0)
position[2] -= numpy.where(currentStep == IN, 1, 0)
return position
def walkSteps(numPart=1, numstep=100):
positionsArray = numpy.zeros(shape=(numstep+1, 3), dtype=int)
for step in numpy.arange(numstep):
positionsArray[step+1, ] = positionsArray[step, ] + singleStep()
tuple = (positionsArray, numstep)
return tuple
def drawWalk(tuple):
positionsArray = tuple[0]
fig = go.Figure(data=go.Scatter3d(
x=positionsArray[:, 0],
y=positionsArray[:, 1],
z=positionsArray[:, 2],
mode='markers',
name='Randomwalk in 2 Dimensions',
marker=dict(
color=numpy.arange(tuple[1]),
size=5,
colorscale='Greens',
showscale=True),
line=dict(
color='darkblue',
width=2
)
))
fig.update_layout(
autosize=False,
height=800,
width=1310)
fig.show()
def main():
drawWalk(walkSteps(1, 5000))
if __name__ == "__main__":
main()
Fassen wir wieder zusammen: wir starten wiede am Punkt (0,0,0) und machen wieder zufällig einen Schritt in irgendeine Richtung, wobei alle Schritte wieder gleich Wahrscheinlich sind und das Ergebnis des vorherigen Schritts keine Auswirkungen auf das Ergebnis des folgenden Schritts hat. Auch hier erhalten wir unsere neue Position indem wir auf unsere vorherige Position den neuen Schritt aufaddieren und das Ergebnis im Array ablegen. Auch hier verwenden wir keinen Seed und erhalten deshalb mit jedem Ausführen neue Zufallszahlen und dementsprechend auch ein neues Bild.
Im folgenden Notebook beschäftigen wir uns dann mit einem RandomWalk der so lange läuft bis er einen Punkt trifft, oder bis ihm die Schritte ausgehen.